﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using UricaoWeb.LogicaDeNegocios.Menu;
using UricaoWeb.LogicaDeNegocios.Restaurantes;
using UricaoWeb.LogicaDeNegocios.Seguridad_y_Roles;
using System.Windows.Forms;

namespace UricaoWeb.Presentacion
{
    public partial class API_menu_ModificarMenu : API_Seguridad_Principal
    {
        List<Plato> listaPlato = new List<Plato>();
        List<Plato> listaPlatoAux = new List<Plato>();
        List<Men_Pla> listaPlatoMenu = new List<Men_Pla>();
        List<int> listaIdPlato = new List<int>();
        List<Restaurante> listaRestaurante = new List<Restaurante>();
        UricaoWeb.LogicaDeNegocios.Menu.Menu menuModificar = new LogicaDeNegocios.Menu.Menu();
        private bool switchActivo;
        // se traen los id restaurante y el id menu de la pagina Buscar Menu
        int idRestaurante = Presentacion.API_menu_BuscarMenu.idRestaurante;
        int idMenu = Presentacion.API_menu_BuscarMenu.idMenu; 

        ///<sumary>
        ///Metodo que se encarga de cargar la pagina
        ///Parámetros:
        ///Object sender: objeto obtenido 
        ///EventArgs e:  evento de la ventana 
        ///</sumary>

        protected void Page_Load(object sender, EventArgs e)
        {
            var master = Master as MasterPage;
            if (master != null)
            {
                master.actualizar_label();
            }
            base.validar_usuario();
            Logica_Usuario _usuario = (Logica_Usuario)Session["user"];
            Session["idHotel"] = _usuario.FkHotel;

            if (!IsPostBack)  // verificar si la pagina se muestra por primera vez
            {
                menuModificar = cargarDatosMenu(idMenu);
                desparcerLabels();
                LMensaje.Visible = false;
                comboRestaurant.Items.Clear();
                listboxPlatoDisp.Items.Clear();
                listboxPlatoMenu.Items.Clear();
                listaPlato = NegocioMenu.ObtenerTodosPlatos();
                listaPlatoMenu = NegocioMenu.ObtenerMenuPlatoPorMenu(idMenu);

                // Se agrega a una lista de int los id de platos que cumplan la condicion
                foreach (Men_Pla iterador in listaPlatoMenu)
                {
                    if (iterador.FkMenu == idMenu)
                        this.listaIdPlato.Add(iterador.FkPlato);
                }

                // se recorre la lista de id plato y la lista de objeto Plato
                // se comparan los id y si son iguales se agrega al listbox de platos que tiene el menu actualmente
                // y se agregan en una lista auxiliar
                foreach (int num in listaIdPlato)
                {
                    foreach (Plato item in listaPlato)
                    {
                        if (item.IdPlato == num)
                        {
                            listboxPlatoMenu.Items.Add(item.NombrePlato);
                            listaPlatoAux.Add(item);
                        }
                    }
                }

                // se recorre la lista auxiliar y se eliminan los Platos de la lista original
                foreach (Plato li in listaPlatoAux)
                {
                    listaPlato.Remove(li);
                }

                //se agregan en el listbox de platos disponibles, los platos que estan disponibles para ser agregados
                foreach (Plato it in listaPlato)
                {
                    listboxPlatoDisp.Items.Add(it.NombrePlato);
                }

                listaRestaurante = NegocioMenu.ObtenerRestaurantesPorHotel(int.Parse(Session["idHotel"].ToString())); 
                foreach (Restaurante rest in listaRestaurante)
                {
                    this.comboRestaurant.Items.Add(rest.NombreRestaurante);
                }
            }
        }

        ///<sumary>
        ///Metodo que se encarga de cargar los datos del Menu seleccionado en la ventana Buscar Menu
        ///Parámetros:
        ///int idMenu: id del menu que se va a modificar
        ///</sumary>
        public UricaoWeb.LogicaDeNegocios.Menu.Menu cargarDatosMenu(int idMenuM)
        {
            UricaoWeb.LogicaDeNegocios.Menu.Menu menu = new LogicaDeNegocios.Menu.Menu();
            menu = NegocioMenu.ObtenerMenus(idMenuM);
            textoNombre.Text = menu.NombreMenu;
            comboTipo.Text = menu.TipoMenu;
            foreach (Restaurante r in listaRestaurante)
            {
                if (r.IdRestaurante == idRestaurante)  
                    comboRestaurant.Text = r.NombreRestaurante;
            }
            //switch de activo e inactivo
            if (menu.ActivoMenu == true)
            {
                this.InputValue = "checked";
            }
            else
                this.InputValue = "";
            return menu;
        }
        // ocultar labels de error
        public void desparcerLabels()
        {
            LNombre.Visible = false;
        }
        // validacion campos vacios
        public void buscarCamposVacios()
        {
            if (this.textoNombre.Text == "")
                LNombre.Visible = true;
            else
                LNombre.Visible = false;
        }

        ///<sumary>
        ///Metodo que se encarga de guardar el objeto Menu con los campos modificados
        ///</sumary>
        public UricaoWeb.LogicaDeNegocios.Menu.Menu actualizarDatosMenu()
        {
            UricaoWeb.LogicaDeNegocios.Menu.Menu menu = new LogicaDeNegocios.Menu.Menu();
            menu.IdMenu = idMenu;
            menu.NombreMenu = textoNombre.Text;
            menu.TipoMenu = comboTipo.Text;
            if (this.switchActivo == true)
            {
                this.InputValue = "checked";
            }
            else
                this.InputValue = "";
            return menu;
        }

        ///<sumary>
        ///Metodo que se encarga de pasar elementos del listbox PlatoDisp al listbox PlatoMenu
        ///Object sender: objeto obtenido 
        ///EventArgs e:  evento de la ventana 
        ///</sumary>
        protected void botonAgregar_Click(object sender, EventArgs e)
        {
            List<string> itemsborrar = new List<string>();
            // se pasan los elementos al listbox PlatoMenu
            foreach (ListItem li in listboxPlatoDisp.Items)
            {
                if (li.Selected == true)
                {
                    listboxPlatoMenu.Items.Add(li.Text);
                    itemsborrar.Add(li.Text);
                }
            }
            // se eliminan los elementos del listbox PlatoDisp
            foreach (string item in itemsborrar)
            {
                listboxPlatoDisp.Items.Remove(item);
            }
        }

        ///<sumary>
        ///Metodo que se encarga de pasar elementos del listbox PlatoMenu al listbox PlatoDisp
        ///Object sender: objeto obtenido 
        ///EventArgs e:  evento de la ventana 
        ///</sumary>
        protected void botonRemover_Click(object sender, EventArgs e)
        {
            List<string> itemsborrar = new List<string>();
            // se pasan los elementos al listbox PlatoDisp
            foreach (ListItem li in listboxPlatoMenu.Items)
            {
                if (li.Selected == true)
                {
                    listboxPlatoDisp.Items.Add(li.Text);
                    itemsborrar.Add(li.Text);

                }
            }
            // se eliminan los elementos del listbox PlatoMenu
            foreach (string item in itemsborrar)
            {
                listboxPlatoMenu.Items.Remove(item);
            }
        }
        protected string InputValue { get; set; }

        // validar que sea string el textbox Nombre
        protected bool validarString()
        {
            String TxtBx = textoNombre.Text;
            foreach (char car in TxtBx)
            {
                if (car > '0' && car < '9')
                {
                    return false;
                }
            }
            return true;
        }

        ///<sumary>
        ///Metodo que se encarga de modificar el Menu 
        ///Object sender: objeto obtenido 
        ///EventArgs e:  evento de la ventana 
        ///</sumary>
        protected void botonModificar_Click(object sender, EventArgs e)
        {
            if (textoNombre.Text != "")
            {
                if (validarString())
                {
                    // se eliminan de la tabla Men_Pla los elementos que coincidan con el idMenu a modificar
                    NegocioMenu.EliminarMenuPlatoporMenu(idMenu); 
                    listaPlatoMenu.Clear();
                    listaPlato.Clear();
                    // se recorre el listbox PlatoMenu y se agregan los elementos a la lista listaPlato
                    foreach (ListItem valor in listboxPlatoMenu.Items)
                    {
                        listaPlato.Add(NegocioMenu.ObtenerTodosPlatosPorNombre(valor.Text));
                    }
                    // procedimiento que llama a la Base de Datos para agregar en la tabla Men_Pla los menus con sus platos
                    foreach (Plato item in listaPlato)
                    {
                        NegocioMenu.AgregarMenuPlato(idMenu, item.IdPlato);
                    }

                    if (Request.Form["onoffswitch"] == "on")
                        switchActivo = true;
                    else
                        switchActivo = false;
                    // se actualizan los datos del objeto Menu y se actualiza en la BD
                    menuModificar = actualizarDatosMenu();
                    NegocioMenu.ModificarMenu(menuModificar.IdMenu, menuModificar.NombreMenu, menuModificar.TipoMenu, switchActivo, idRestaurante);
                    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "redirect script", //aca se coloca el codigo del error
                            "alert('El menu ha sido modificado satisfactoriamente'); location.href='API_menu_ModificarMenu.aspx';", true);
                }
            }
            else
            {
                desparcerLabels();
                LMensaje.Text = "Por Favor, completar campos vacios (*)";
                LMensaje.Visible = true;
                buscarCamposVacios();
            }
        }
        //regresar a la pagina Buscar Menu
        protected void botonRegresar_Click(object sender, EventArgs e)
        {
            Response.Redirect("~/Presentacion/API_menu_BuscarMenu.aspx");
        }

    }
}